EMM386.EXE
EMM386.EXE 파일은 프롬프트 명령어로도 사용될 수 있고, Config.sys에서 장치 제어기로도 사용될 수 있다.
EMM386.EXE가 장치 제어기로 사용되는 경우 시스템에 설치되어 있는 연속 확장 메모리를 중첩 확장 메모리로 사용할 수 있도록 에뮬레이트하고, 도스용 프로그램이 상위 메모리에 접속할 수 있도록 한다. 또한, Weitek 수치 연산 보조 처리기의 지원 여부를 결정할 수 있다.
■ 명령어 위치
윈도우가 설치되어 있는 하드디스크(C:\Windows)에 실행 파일 형태로 존재하는 외부 명령어
■ 사용법
DEVICE = [drive:][path]EMM386.EXE [ON | OFF | AUTO] [memory] [RAM]
[NOEMS] [W=ON | W=OFF] [ALTBOOT] [NOVCPI] [MIN=minsize]
[HIGHSCAN] [VERBOSE] [NOHI] [NOMOVEXBDA] [B=address]
[Mx | FRAME=address | /Pmmmm] [Pn=address] [X=mmmm-nnnn]
[I=mmmm-nnnn] [L=minXMS] [A=altregs] [H=handels] [D=nnn]
[RAM=mmmm-nnnn] [WIN=mmmm-nnnn] [ROM=mmmm-nnnn]
■ 옵션 및 매개변수

[drive:][path] | EMM386.EXE 파일이 있는 드라이브와 경로를 지정한다.
on|off|auto | EMM386 장치 제어기의 활성 상태를 지정한다. ON으로 설정하는 것은 드라이버를 활성화시키는 것이고, OFF는 드라이버를 비활성 상태로 한다. AUTO는 응용 프로그램이 중첩 확장 메모리의 사용을 요청할 경우에는 ON으로 되고, 응용 프로그램이 중첩 확장 메모리를 사용하지 않는 경우에는 OFF로 자동 설정되도록 하는 경우에 사용하는 옵션이다.
memory | 사용자가 중첩 확장 메모리로 할당하고자 하는 메모리의 양을 KB 단위로 지정한다. 메모리로 지정할 수 있는 범위는 16∼32768KB까지이고, 사용자가 메모리의 양을 지정하지 않은 경우 디폴트로 256KB가 설정된다. 사용자가 지정하는 메모리의 단위는 16KB씩 사용되는데 만약 16KB 단위로 끊어지지 않는 경우에는 가장 가까운 단위에서 끊겨 사용된다. 즉, 지정한 메모리의 값이 34KB인 경우에는 32KB만 지정되어 사용된다.
ram | 중첩 확장 메모리와 연속 메모리를 모두 사용할 필요가 있을 경우에는 이 옵션을 지정한다.
noems | 이 옵션을 지정하면 상위 메모리는 사용할 수 있도록 접속을 제공하지만 중첩 확장 메모리를 에뮬레이트하지 않는다.
w=on|w=off | Weiteck 수치 연산 보조 처리기에 대한 지원을 지정한다. 디폴트는 W=OFF이다.
altboot | <Ctrl+Alt+Del>을 눌러 컴퓨터를 재시동할 때 EMM386이 사용할 선택 핸들을 지정한다.
novcpi | VCPI 응용 프로그램을 사용하지 못하게 한다. 이 옵션은 NOEMS 옵션에서 사용되어야 하며, NOEMS 옵션을 지정하지 않고, 이 옵션을 지정하면 EMM386은 VCPI를 실행시킬 수 없다. 두 옵션을 함께 지정하면 memory 매개변수와 min=minsize 옵션을 무시한다. VCPI 응용 프로그램은 할당된 확장 메모리를 감소시키지 않는다.
min=minsize | EMM386이 지원할 수 있는 EMS/VCPI 메모리의 최소값을 키로 바이트 단위로 지정한다. 지정할 수 있는 값의 범위는 16∼32768KB까지이고, 디폴트 값은 256KB이다. 만약, NOEMS 옵션을 지정하면 디폴트 값이 0이 된다. 최소값은 16KB 이상이 되고, EMM386은 여기서 지정한 값을 최소값으로 사용한다.
highscan | 사용 가능한 상위 메모리 영역을 검색하지 않도록 제한한다. 일반적으로 EMM386을 사용하는데 문제가 발생할 때에만 이 옵션을 지정한다.
verbose | EMM386이 메모리에 탑재되는 동안의 상태와 오류 메시지를 보여주도록 설정한다. EMM386은 디폴트로 이런 메시지를 표시하지 않도록 설정되어 있다. 이 옵션은 V로 줄여서 사용할 수 있다.
nohi | EMM386을 상위 메모리 영역으로 탑재하지 못하도록 한다. 일반적으로 EMM386의 일부분이 상위 메모리 영역으로 탑재되는데 이 옵션을 지정하면 사용 가능한 상용 메모리가 감소하고, 사용 가능한 상위 메모리를 증가시킨다.
nomovexbda | EMM386을 상용 메모리에서 상위 메모리 영역으로 이동하지 못하도록 제한한다.
b=address | EMS 뱅킹(16KB의 페이지 스와핑)에 유효한 가장 낮은 세그먼트 주소를 지정한다. 사용할 수 있는 값은 1000h∼4000h 범위이고, 디폴트는 4000h이다.
mx | 페이지 프레임의 주소를 지정한다. x에 대한 유효한 값은 1∼14까지이다. 다음은 x의 값으로 지정한 값에 대하여 지정된 주소 값이다. 1 : C000 2 : C400 3 : C800 4 : CC00 5 : D000 6 : D400 7 : D800 8 : DC00 9 : E000 10 : 8000 11 : 8400 12 : 8800 13 : 8C00 14 : 9000 위의 예에서 10∼14까지의 어드레스는 512KB 이상의 시스템 메모리를 가진 컴퓨터에서만 사용되어야 한다.
frame=address | 페이지 프레임 세그먼트 주소를 직접 지정하기 위하여 사용하는 옵션으로 address에 유효한 값은 400H를 증가량으로, 8000h∼9000h와 C000h∼E000h 사이에서 지정할 수 있고, 512KB 이상의 시스템 메모리를 가진 컴퓨터의 경우에는 8000부터 9000까지 지정할 수 있다. 만약, 중첩 확장 메모리를 지원하고 페이지 프레임 세그먼트를 사용하지 못하도록 지정하려면, FRAME=NONE으로 지정한다. 하지만 이렇게 하면 중첩 확장 메모리를 필요로 하는 프로그램이 정상적으로 실행되지 못하는 경우도 있다.
/pmmmm | 위의 FRAME=address 옵션과 마찬가지로 mmmm에 페이지 프레임 세그먼트의 주소를 직접 지정하기 위하여 사용한다.
pn=address | 특정 페이지의 세그먼트 주소를 지정하는데 사용하는 옵션으로, n은 사용자가 지정하는 페이지 번호이고, address는 사용자가 지정하고자 하는 세그먼트 주소를 의미한다. n에 사용할 수 있는 값은 0∼255 범위의 숫자이고, address에는 400H를 증가량으로 하여 C000∼EC00, 8000∼9C00의 범위 내에서 지정한다. 페이지 0∼3까지에 대한 주소는 LIMs 버전 3.2와의 호환성 유지를 위해 연속적으로 지정해야만 한다. Mx, FRAME 혹은 /Pmmmm 옵션을 사용하는 경우에는 페이지 프레임을 위하여 0∼3 범위의 어드레스를 지정할 수 없다.
x=mmmm-nnnn | EMM386.EXE가 EMS 페이지를 위한 세그먼트 어드레스의 특정 범위 사용하지 못하게 제한하기 위하여 사용하는 옵션이다. mmmm과 nnnn의 유효한 값은 페이지의 단위인 4KB 단위로 A000∼FFFF 범위의 주소 값이다. 만약, 지정한 어드레스가 4KB 단위로 끊기지 않는 경우에는 가장 근접한 4KB 단위까지를 사용하지 않는다. x옵션과 i 옵션이 겹치는 경우에는 x 옵션이 우선되고, i 옵션은 겹치는 부분에 대해서만 무시된다.
immmm-nnnn | x 옵션과는 반대로, EMS 페이지나 RAM에 사용되는 세그먼트 주소 값을 지정한다. mmmm과 nnnn에 사용할 수 있는 값은 x 옵션의 값과 같고, x 옵션에서 지정한 범위와 겹치는 경우에는 무시된다.
L=minXMS | 연속 확장 메모리로 지정된 메모리가 EMM386.EXE를 탑재한 후에도 연속 확장 메모리로 사용될 수 있도록 하기 위하여 사용하는 옵션으로, 사용할 수 있는 단위는 KB 단위이고, 디폴트는 0이다.
a=altregs | 사용자가 EMM386에 할당하려는 대치 레지스터의 수를 지정한다. 지정할 수 있는 값의 범위는 0∼254 사이의 값으로 디폴트는 7이다. 대치 레지스터 수를 지정하면 EMM386 메모리 내에 200 바이트가 추가된다.
h=handles | EMM386이 사용할 수 있는 핸들 수를 지정한다. 지정할 수 있는 핸들 수는 2∼255 까지이고, 디폴트 핸들 수는 64개이다.
d=nnn | DMA 버퍼를 위해 비축할 메모리의 양을 지정한다. nnn은 16∼256 범위에서 KB 단위로 지정될 수 있고, 디폴트 값은 16이다. 이 값은 EMM이 활성 상태일 때 발생할 수 있는 가장 큰 MDA보다는 최소한 커야 한다.
ram=mmmm-nnnn | 중첩 확장 메모리와 상위 메모리 영역을 사용할 수 있도록 한다. 범위를 지정하지 않으면, EMM386은 연속 확장 메모리의 유효한 범위를 사용한다.
win=mmmm-nnnn | EMM386 대신 마이크로소프트 윈도우를 위한 세그먼트 주소의 지정된 범위를 반대로 한다. mmmm과 nnnn의 유효한 값은 A000∼FFFF 사이의 값으로 4KB 단위로 사용된다. 만약, X 옵션으로 지정한 범위와 겹치는 경우에는 WIN 옵션으로 지정한 값은 무시되고 X 옵션이 우선권을 가진다. WIN 옵션과 RAM, ROM, i 옵션의 범위가 겹치면 WIN 옵션이 우선권을 가진다.
rom=mmmm-nnnn | EMM386이 ROM으로 사용된 shadow RAM의 주소로 사용하는 세그먼트 주소의 범위를 지정한다. mmmm과 nnnn의 유효 범위는 A000∼FFFF 사이의 값으로 4KB 단위로 사용된다. 이 옵션을 지정하면 shadow RAM을 사용하는 것과 같은 효과가 있다. 즉, BIOS의 내용을 속도가 느린 ROM에서 읽는 것이 아니라 속도가 빠른 RAM에 복사하여 읽기 때문에 시스템의 속도가 빨라진다.

■ 사용상의 주의
☞ HIMEM.SYS의 설치
EMM386.EXE를 위한 Device 명령어 이전에 반드시 Config.sys 파일에 Himem.sys를 위한 Device 명령어를 포함하고 있어야 한다.
즉, EMM386을 장치 제어기로 사용하기 위해서는 반드시 Himem.sys를 설치해야만 한다.
☞ 메모리 옵션 사용하기
EMM386.EXE를 설치할 때 상위 메모리 영역을 사용하지 않으려면 메모리 옵션을 사용할 필요가 없다. 그러면 EMM386은 디폴트 값으로 실행된다.
특별한 경우에는 EMM386.EXE가 메모리를 사용하는 방법을 조정할 필요가 있는데, 이 경우 메모리 옵션은 신중하게 사용되어야 한다. 잘못 지정된 메모리 옵션은 심한 경우 시스템을 중지시킬 수 있기 때문이다.
☞ 상위 메모리에 접속하는데 EMM386.EXE 사용하기
EMM386.EXE는 중첩 확장 메모리를 에뮬레이트할 뿐만 아니라 하드웨어에서 사용하지 않는 상위 메모리에도 접속할 수 있도록 한다.
또한, 연속 확장 메모리와 중첩 확장 메모리에 동시에 접속할 수 있고, 연속 확장 메모리에만 접속을 제공할 수 있다. 만약, 연속 확장 메모리에만 접속하려면 NOEMS 옵션을 사용한다.
이 옵션은 연속 확장 메모리에는 접속을 제공하지만 중첩 확장 메모리를 에뮬레이트하지는 않는다. 만약, 연속 확장 메모리에 접속을 제공하면서 동시에 중첩 확장 메모리를 에뮬레이트하기를 원한다면 RAM 옵션을 사용한다.
RAM이나 NOEMS 옵션을 사용하고자 하는 경우, Config.sys 파일에 DOS=UMB 명령어 라인을 포함시켜야만 한다. 또한, EMM386.EXE를 위한 Device 명령어는 모든 Devicehigh 명령어 라인보다 선행하여야만 한다.
만약, Lotus 1-2-3 버전 3.1과 같은 VCPI 응용 프로그램을 사용하고 있다면, 중첩 확장 메모리에의 접속을 제공하기 위하여 RAM 옵션을 사용하여야 한다.
☞ 페이지 프레임에 부적당한 메모리 영역
EMM386.EXE가 페이지 프레임을 위하여 연속되는 64KB의 메모리 공간을 찾지 못하면 다음과 같은 메시지가 나타난다.
Unable to set base address
☞ 중첩 확장 메모리와 연속 확장 메모리의 공유
EMM386은 연속 확장 메모리를 중첩 확장 메모리 에뮬레이트하는데, 중첩 확장 메모리가 필요한 프로그램을 위해 중첩 확장 메모리를 제공하기 위하여 MIN 옵션으로 지정된 메모리 양을 확보해둔다.
이처럼 일단 중첩 확장 메모리를 위하여 일정량의 메모리를 확보하면 항상 중첩 확장 메모리로 사용할 수 있지만 연속 확장 메모리로는 사용할 수 없다. 만약, MIN 옵션으로 지정한 메모리 양이 큰 경우에는 그만큼 불필요한 메모리를 낭비하는 것이 된다.
따라서, 불필요한 메모리의 사용을 억제하고, 필요한 경우에 따라 연속 확장 메모리로도 사용하고 중첩 확장 메모리로도 사용하려면 MIN 옵션에 최소 메모리의 크기를 0으로 지정하기 바란다.
즉, MIN=0 옵션을 지정한 경우에는 프로그램이 중첩 확장 메모리를 요구하는 경우에만 이를 제공하고, 요구하지 않는 경우에는 다시 연속 확장 메모리로 사용할 수 있게 한다.
그러나, 선행하는 프로그램이 미리 연속 확장 메모리를 모두 할당해 두었다면 다른 프로그램이 중첩 확장 메모리의 필요량을 요구할 때 제공할 수 없게 된다.
☞ EMM386을 사용할 때 SMARTDRV 이중 버퍼 사용하기
SCSI, ESDI 혹은 다른 방식의 하드디스크를 사용하는 경우에도 Config.sys 파일에 다음과 같이 Device 명령어를 사용할 수 있다.
device=smartdrv.exe /double_buffer
그러나, 이중 버퍼를 사용하기 위해서는 Devicehigh 명령문이나 중첩 확장 메모리를 사용하는 장치 제어기를 탑재하는 명령문 앞에 위의 명령어를 지정해야 한다.
SCSI 제어기나 EDSI 제어기를 사용 가능하게 하는 명령문은 상위 메모리 영역이나 중첩 확장 메모리를 사용하는 프로그램에 정보를 전달한다.
■ 사용 예
EMM386.EXE의 디폴트 값을 사용하면서 중첩 확장 메모리를 에뮬레이트하려면 다음 내용을 Config.sys 파일에 추가한다.
device=himem.sys
device=emm386.exe
위의 예에서 Himem.sys와 EMM386.EXE 파일의 경로를 지정하지 않았으므로 DOS는 시동 드라이브의 루트 디렉토리에서 Himem.sys와 EMM386.EXE 파일을 찾는다.
1024KB의 메모리를 EMM386.EXE에 할당하고, 파일이 C드라이브의 DOS 디렉토리에 있는 경우에는 다음과 같은 명령어 라인을 Config.sys 파일에 추가한다.
device=c:\dos\emm386.exe 1024
중첩 확장 메모리를 에뮬레이트하고, EMS 페이지 프레임을 위하여 세그먼트 어드레스를 D000H로 지정하되 할당하는 메모리를 512KB로 하려면 다음의 예 중에서 하나를 Config.sys 파일에 추가한다.
device=emm386.exe 512 frame=d000
device=emm386.exe 512 p0=d000 p1=d400 p2=d800 p3=dc00
위의 예에서 메모리의 상태를 설정하는데 있어 EMM386.EXE가 E000H에서 EC00H까지의 메모리를 사용하지 못하도록 설정하고, EMM이 127개의 핸들을 사용할 수 있도록 지정하려면 다음과 같은 명령어 라인을 Config.sys 파일 안에 추가한다.
device=emm386.exe 512 frame=d000 x=e000-ec00 h=127
상위 메모리에는 접속을 제공하고 연속 확장 메모리를 에뮬레이트하지 않도록 지정하려면, 다음을 Config.sys 파일에 추가한다.
device=emm386.exe noems novcpi
연속 메모리에도 접속을 제공하면서 중첩 확장 메모리도 에뮬레이트하려면 다음 명령어 라인을 Config.sys 파일에 추가한다.
device=emm386.exe ram